home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / mtools.lha / mtools-2.0.7 / mkmanifest.c < prev    next >
C/C++ Source or Header  |  1992-09-10  |  2KB  |  122 lines

  1. /*
  2.  * A program to create a manifest (shiping list) that is a shell script
  3.  * to return a Unix file name to it's original state after it has been
  4.  * clobbered by MSDOS's file name restrictions.
  5.  *
  6.  *    This code also used in arc, mtools, and pcomm
  7.  */
  8.  
  9. #ifdef BSD
  10. #define strrchr rindex
  11. #endif /* BSD */
  12.  
  13. #include <stdio.h>
  14. #include <ctype.h>
  15.  
  16. main(argc, argv)
  17. int argc;
  18. char *argv[];
  19. {
  20.     int i;
  21.     char *name, *new_name, *dos_name(), *strrchr();
  22.     void exit();
  23.  
  24.     if (argc == 1) {
  25.         fprintf(stderr, "Usage: mkmanifest <list-of-files>\n");
  26.         exit(1);
  27.     }
  28.  
  29.     for (i=1; i<argc; i++) {
  30.                     /* zap the leading path */
  31.         if (name = strrchr(argv[i], '/'))
  32.             name++;
  33.         else
  34.             name = argv[i];
  35.                     /* create new name */
  36.         new_name = dos_name(name);
  37.  
  38.         if (strcmp(new_name, name))
  39.             printf("mv %s %s\n", new_name, name);
  40.     }
  41.     exit(0);
  42. }
  43.  
  44. char *
  45. dos_name(name)
  46. char *name;
  47. {
  48.     static char *dev[9] = {"con", "aux", "com1", "com2", "lpt1", "prn",
  49.     "lpt2", "lpt3", "nul"};
  50.     char *s, *temp, *ext, *strcpy(), *strpbrk(), *strcat();
  51.     char buf[15];
  52.     int i, dot;
  53.     static char ans[13];
  54.  
  55.     strcpy(buf, name);
  56.     temp = buf;
  57.                     /* separate the name from extention */
  58.     ext = "";
  59.     dot = 0;
  60.     for (i=strlen(buf)-1; i>=0; i--) {
  61.         if (buf[i] == '.' && !dot) {
  62.             dot = 1;
  63.             buf[i] = '\0';
  64.             ext = &buf[i+1];
  65.         }
  66.         if (isupper(buf[i]))
  67.             buf[i] = tolower(buf[i]);
  68.     }
  69.                     /* if no name */
  70.     if (*temp == '\0')
  71.         temp = "x";
  72.                     /* if name is a device */
  73.     for (i=0; i<9; i++) {
  74.         if (!strcmp(temp, dev[i])) 
  75.             *temp = 'x';
  76.     }
  77.                     /* name too long? */
  78.     if (strlen(temp) > 8)
  79.         *(temp+8) = '\0';
  80.                     /* extention too long? */
  81.     if (strlen(ext) > 3)
  82.         *(ext+3) = '\0';
  83.                     /* illegal characters? */
  84.     while (s = strpbrk(temp, "^+=/[]:',?*\\<>|\". "))
  85.         *s = 'x';
  86.  
  87.     while (s = strpbrk(ext, "^+=/[]:',?*\\<>|\". "))
  88.         *s = 'x';
  89.  
  90.     strcpy(ans, temp);
  91.     if (*ext) {
  92.         strcat(ans, ".");
  93.         strcat(ans, ext);
  94.     }
  95.     return(ans);
  96. }
  97.  
  98. #ifdef BSD
  99. /*
  100.  * Return ptr to first occurrence of any character from `brkset'
  101.  * in the character string `string'; NULL if none exists.
  102.  */
  103.  
  104. char *
  105. strpbrk(string, brkset)
  106. register char *string, *brkset;
  107. {
  108.     register char *p;
  109.  
  110.     if (!string || !brkset)
  111.         return(0);
  112.     do {
  113.         for (p = brkset; *p != '\0' && *p != *string; ++p)
  114.             ;
  115.         if (*p != '\0')
  116.             return(string);
  117.     }
  118.     while (*string++);
  119.     return(0);
  120. }
  121. #endif /* BSD */
  122.